Fix file chooser refcounting issues
authorMatthias Clasen <mclasen@redhat.com>
Tue, 9 Mar 2010 04:56:43 +0000 (23:56 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 9 Mar 2010 04:56:43 +0000 (23:56 -0500)
This was reported in bug 600992.

gtk/gtkfilechooserbutton.c
gtk/gtkfilechooserdefault.c
gtk/gtkfilesystem.c
gtk/gtkfilesystem.h
gtk/gtkpathbar.c

index 441c15b697a56564fa19379bdde2c07e0c61346b..b7227a0becb901d1b4ad75f40ffc16e6a3c0cc1a 100644 (file)
@@ -1586,7 +1586,7 @@ model_free_row_data (GtkFileChooserButton *button,
       g_object_unref (data);
       break;
     case ROW_TYPE_VOLUME:
-      _gtk_file_system_volume_free (data);
+      _gtk_file_system_volume_unref (data);
       break;
     default:
       break;
@@ -1777,11 +1777,16 @@ model_add_volumes (GtkFileChooserButton *button,
              GFile *base_file;
 
              base_file = _gtk_file_system_volume_get_root (volume);
-             if (base_file != NULL && !g_file_is_native (base_file))
-               {
-                 _gtk_file_system_volume_free (volume);
-                 continue;
-               }
+             if (base_file != NULL)
+                {
+                  if (!g_file_is_native (base_file))
+                    {
+                      g_object_unref (base_file);
+                      continue;
+                    }
+                  else
+                    g_object_unref (base_file);
+                }
            }
        }
 
@@ -1796,7 +1801,7 @@ model_add_volumes (GtkFileChooserButton *button,
                          ICON_COLUMN, pixbuf,
                          DISPLAY_NAME_COLUMN, display_name,
                          TYPE_COLUMN, ROW_TYPE_VOLUME,
-                         DATA_COLUMN, volume,
+                         DATA_COLUMN, _gtk_file_system_volume_ref (volume),
                          IS_FOLDER_COLUMN, TRUE,
                          -1);
 
@@ -2334,7 +2339,7 @@ update_label_and_image (GtkFileChooserButton *button)
          if (base_file)
            g_object_unref (base_file);
 
-         _gtk_file_system_volume_free (volume);
+         _gtk_file_system_volume_unref (volume);
 
          if (label_text)
            goto out;
index eefe49c56de0256fe07dadbb8f5fc2d6e2030880..81150d07ec7d9bdf516bb59e4446c6699857249a 100644 (file)
@@ -762,14 +762,12 @@ shortcuts_free_row_data (GtkFileChooserDefault *impl,
       GtkFileSystemVolume *volume;
 
       volume = col_data;
-      _gtk_file_system_volume_free (volume);
+      _gtk_file_system_volume_unref (volume);
     }
-  else
+  if (shortcut_type == SHORTCUT_TYPE_FILE)
     {
       GFile *file;
 
-      g_assert (shortcut_type == SHORTCUT_TYPE_FILE);
-
       file = col_data;
       g_object_unref (file);
     }
@@ -2015,7 +2013,14 @@ shortcuts_add_volumes (GtkFileChooserDefault *impl)
            }
        }
 
-      shortcuts_insert_file (impl, start_row + n, SHORTCUT_TYPE_VOLUME, volume, NULL, NULL, FALSE, SHORTCUTS_VOLUMES);
+      shortcuts_insert_file (impl,
+                             start_row + n,
+                             SHORTCUT_TYPE_VOLUME,
+                             _gtk_file_system_volume_ref (volume),
+                             NULL,
+                             NULL,
+                             FALSE,
+                             SHORTCUTS_VOLUMES);
       n++;
     }
 
@@ -3437,9 +3442,7 @@ shortcuts_query_tooltip_cb (GtkWidget             *widget,
       if (shortcut_type == SHORTCUT_TYPE_SEPARATOR)
        return FALSE;
       else if (shortcut_type == SHORTCUT_TYPE_VOLUME)
-       {
-         return FALSE;
-       }
+        return FALSE;
       else if (shortcut_type == SHORTCUT_TYPE_FILE)
        {
          GFile *file;
@@ -9770,6 +9773,9 @@ shortcuts_activate_mount_enclosing_volume (GCancellable        *cancellable,
     _gtk_file_system_get_info (data->impl->file_system, data->file,
                               "standard::type",
                               shortcuts_activate_get_info_cb, data);
+
+  if (volume)
+    _gtk_file_system_volume_unref (volume);
 }
 
 static void
index bc6cbf588db2ce8ad2658c4e05a715b56583556f..ea79fed044ab17e17474566c2daa4bfb92599b3d 100644 (file)
@@ -468,6 +468,8 @@ get_volumes_list (GtkFileSystem *file_system)
 
          priv->volumes = g_slist_prepend (priv->volumes, g_object_ref (drive));
        }
+
+      g_object_unref (drive);
     }
 
   g_list_free (drives);
@@ -499,6 +501,8 @@ get_volumes_list (GtkFileSystem *file_system)
           /* see comment above in why we add an icon for a volume */
           priv->volumes = g_slist_prepend (priv->volumes, g_object_ref (volume));
         }
+
+      g_object_unref (volume);
     }
 
   /* add mounts that has no volume (/etc/mtab mounts, ftp, sftp,...) */
@@ -520,11 +524,13 @@ get_volumes_list (GtkFileSystem *file_system)
        */
       if (mount_referenced_by_volume_activation_root (volumes, mount))
         {
+          g_object_unref (mount);
           continue;
         }
 
       /* show this mount */
       priv->volumes = g_slist_prepend (priv->volumes, g_object_ref (mount));
+      g_object_unref (mount);
     }
 
   g_list_free (volumes);
@@ -1025,6 +1031,8 @@ enclosing_volume_mount_cb (GObject      *source_object,
 
   if (error)
     g_error_free (error);
+
+  _gtk_file_system_volume_unref (volume);
 }
 
 GCancellable *
@@ -1802,8 +1810,22 @@ _gtk_file_system_volume_render_icon (GtkFileSystemVolume  *volume,
   return pixbuf;
 }
 
+GtkFileSystemVolume *
+_gtk_file_system_volume_ref (GtkFileSystemVolume *volume)
+{
+  if (IS_ROOT_VOLUME (volume))
+    return volume;
+
+  if (G_IS_MOUNT (volume)  ||
+      G_IS_VOLUME (volume) ||
+      G_IS_DRIVE (volume))
+    g_object_ref (volume);
+
+  return volume;
+}
+
 void
-_gtk_file_system_volume_free (GtkFileSystemVolume *volume)
+_gtk_file_system_volume_unref (GtkFileSystemVolume *volume)
 {
   /* Root volume doesn't need to be freed */
   if (IS_ROOT_VOLUME (volume))
index 58f1b4191fc4c1e418b1f71d22a1fe687768103e..a92c8f89e99855d8284a960b36acda6eb4cdc3b8 100644 (file)
@@ -162,7 +162,8 @@ GdkPixbuf *           _gtk_file_system_volume_render_icon      (GtkFileSystemVol
                                                                gint                  icon_size,
                                                                GError              **error);
 
-void                  _gtk_file_system_volume_free             (GtkFileSystemVolume *volume);
+GtkFileSystemVolume  *_gtk_file_system_volume_ref              (GtkFileSystemVolume *volume);
+void                  _gtk_file_system_volume_unref            (GtkFileSystemVolume *volume);
 
 /* GtkFileSystemBookmark methods */
 void                   _gtk_file_system_bookmark_free          (GtkFileSystemBookmark *bookmark);
index 48eec632d243146584cdec53460f38413100cc59..87bec1adfc892fd9ac27dba27e2bcdd0e9f144d8 100644 (file)
@@ -1261,7 +1261,7 @@ set_button_image (GtkPathBar *path_bar,
                                                                 GTK_WIDGET (path_bar),
                                                                 path_bar->icon_size,
                                                                 NULL);
-      _gtk_file_system_volume_free (volume);
+      _gtk_file_system_volume_unref (volume);
 
       gtk_image_set_from_pixbuf (GTK_IMAGE (button_data->image), path_bar->root_icon);
       break;